package servidor.principal.control;

import java.rmi.server.UnicastRemoteObject;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

import javax.jdo.Extent;
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;
import javax.jdo.Transaction;

import servidor.dominio.Categoria;
import servidor.dominio.Cliente;
import servidor.principal.control.*;
import servidor.principal.assembler.*;

import comun.dto.*;
import comun.iControl.*;

public class ControlCategoria extends UnicastRemoteObject implements IControlCategoria{
	
	
	public ControlCategoria() throws Exception{
		
		
	}
	
	     
	
	    public boolean addCategoriaDTO(CategoriaDTO pDTO) throws Exception{
	    	PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
	        PersistenceManager pm = pmf.getPersistenceManager();
	        Transaction tx=pm.currentTransaction();
	    	Categoria p = CategoriaAssembler.getCategoria(pDTO);
	    	if (this.existeCategoria(p.getNombre()))  		  
	    		return false;
	    	else{
	    		try{
	    			 tx.begin();
	    	         pm.makePersistent(p);
	    	         tx.commit();
	    	         System.out.println("Categoria dada de alta. OK");
	    			
	    		}
	    		finally
	            {
	                if (tx.isActive())
	                {
	                    tx.rollback();
	                }
	                pm.close();
	            } 
	    	return true;
	    	}

	}
	
	public boolean existeCategoria(String nombre)throws Exception{
		PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
		PersistenceManager pm = pmf.getPersistenceManager();
		Transaction tx=pm.currentTransaction();
		tx = pm.currentTransaction();	        
		boolean existe = false;
		try {

			if (!tx.isActive())tx.begin();
			String filter = "nombre == \""+nombre+"\"";
			Collection categoriaCol= this.getObjects(pm,Categoria.class,filter);
			if (categoriaCol.size()>=1) 
				existe=true;

			try {
				tx.commit(); 
			} catch (RuntimeException e) {
				e.printStackTrace();
				return false;
			}
		} finally {


			if (tx.isActive()) tx.rollback();
		}
		return existe;


	}
	
	public void eliminarCategoria(String nombre) throws Exception{
		PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
		PersistenceManager pm = pmf.getPersistenceManager();
		Transaction tx=pm.currentTransaction();
		try {
			tx.begin();
			if (!tx.isActive())tx.begin();   
			Categoria categoria = new Categoria();
			String filter = "nombre == \""+nombre+"\"";
			Collection CategoriaCol= this.getObjects(pm,Categoria.class,filter);

			Iterator<Categoria> iter = CategoriaCol.iterator();
			while (iter.hasNext()) {
				Categoria cat = iter.next();
				CategoriaDTO catDTO = CategoriaAssembler.getCategoriaDTO(cat);
				pm.deletePersistent(cat);
				//vector.add(clientDTO);
			}           
			/*
				    //Elimino la cta. cte.
					CuentaCorriente cta = cliente.getCuentaCorriente();
					Collection m = cta.getMovimientos();

					for (Iterator i = m.iterator(); i.hasNext(); ) {
						Movimiento movimiento = (Movimiento)i.next();
						this.persistencia.borrarObjeto(movimiento);
					}

					this.persistencia.borrarObjeto(cta);

					//Elimino las empresas
					Collection empresas = cliente.getEmpresas();
					for (Iterator i = empresas.iterator(); i.hasNext(); ) {
							Empresa empresa = (Empresa)i.next();

			                //Elimino el Plan de Cuenta
							PlanDeCuenta plan = empresa.getPlan();
							eliminarCuentas(plan.getCodigoEmpresa());
							this.persistencia.borrarObjeto(plan);

							//Elimino el Libro Diario
							LibroDiario diario = empresa.getLibroDiario();
							eliminarRegistros(diario.getCodigoEmpresa());
							this.persistencia.borrarObjeto(diario);

							this.persistencia.borrarObjeto(empresa);
					}*/

			//pm.deletePersistent(cliente);
			tx.commit();
			System.out.println("Ctaegoria Eliminada. OK");

			//this.persistencia.borrarObjeto(cliente);
			//this.persistencia.cierraTrans();


		}	
		finally
		{
			if (tx.isActive())
			{
				tx.rollback();
			}
			pm.close();
		} 

	}

	
	public void modificarCategoria(CategoriaDTO c) throws Exception{
		PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
		PersistenceManager pm = pmf.getPersistenceManager();
		Transaction tx=pm.currentTransaction();
		try {
			//this.persistencia.AbreTrans();
			tx.begin();
			if (!tx.isActive())tx.begin(); 
			String filter = "nombre == \""+c.getNombre()+"\"";
			Categoria cat= (Categoria) this.getObject(pm,Categoria.class,filter);
			cat.setNombre(c.getNombre());
			cat.setFecha(c.getFecha());
			cat.setSalario(c.getSalario());
			

			tx.commit();
			System.out.println("Categoria Modificada. OK");

		}	
		finally
		{
			if (tx.isActive())
			{
				tx.rollback();
			}
			pm.close();
		} 

	}

	
	 
	  public Vector<CategoriaDTO> getCategorias() throws Exception {
	        PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
	    	PersistenceManager pm = pmf.getPersistenceManager();
	    	Transaction tx=pm.currentTransaction();
	        tx = pm.currentTransaction();
	        
	        Vector<CategoriaDTO> vector = new Vector<CategoriaDTO>();
	        Collection<Categoria> consultaCol = null;       
	        
	        try {
	            if (!tx.isActive())tx.begin();
	            //String filter = "cuitEmpresa == \""+cuit+"\"";
	            consultaCol=  this.getObjects(pm,Categoria.class,null);
	            Iterator<Categoria> iter = consultaCol.iterator();
	            while (iter.hasNext()) {
	            	Categoria cat = iter.next();
	            	CategoriaDTO catDTO = CategoriaAssembler.getCategoriaDTO(cat);
	            	vector.add(catDTO);
	            }            
	            tx.commit();
	        } catch (RuntimeException e) {
	        	e.printStackTrace();
	        } finally {
	        	if (tx.isActive()) tx.rollback();
	        }
	        return vector;
	     }

	  public Vector<CategoriaDTO> getCategoria(String nombre) throws Exception {
	        PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory("jpox.properties");
	    	PersistenceManager pm = pmf.getPersistenceManager();
	    	Transaction tx=pm.currentTransaction();
	        tx = pm.currentTransaction();
	        
	        Vector<CategoriaDTO> vector = new Vector<CategoriaDTO>();
	        Collection<Categoria> consultaCol = null;       
	        
	        try {
	            if (!tx.isActive())tx.begin();
	            String filter = "nombre == \""+nombre+"\"";
	            consultaCol= (Collection<Categoria>) this.getObjects(pm,Categoria.class,filter);
	            Iterator<Categoria> iter = consultaCol.iterator();
	            while (iter.hasNext()) {
	            	Categoria cat = iter.next();
	            	CategoriaDTO catDTO = CategoriaAssembler.getCategoriaDTO(cat);
	            	vector.add(catDTO);
	            }            
	            tx.commit();
	        } catch (RuntimeException e) {
	        	e.printStackTrace();
	        } finally {
	        	if (tx.isActive()) tx.rollback();
	        }
	        return vector;
	     }



	public Object getObject(PersistenceManager pm,Class clase,String filter) throws Exception{
		Object objetoPersistente = null;
		try {

			Extent clnObject = pm.getExtent(clase, true);
			Query query = pm.newQuery(clnObject,filter);
			Collection objetos = (Collection)query.execute();


			Object[] prueba = objetos.toArray();
			if(prueba.length > 0){
				objetoPersistente = prueba[0];
			}	
		}
		catch (Exception ex) {
			ex.printStackTrace();
			throw ex;           
		}
		return objetoPersistente;
	}
	
	public Collection getObjects(PersistenceManager pm, Class clase,String filter)throws Exception{
		Collection retorno=null;
		try{
			Class empleadoClass = clase;
			Extent clnEmpleado=pm.getExtent(empleadoClass, false); 
			Query query = pm.newQuery(clnEmpleado,filter);
			retorno=(Collection)query.execute();
		} catch(Exception e) {
			throw e;
		}
		return retorno;
	}



}
